#include "DHT11.h"
#include "stm32f10x.h"                  // Device header
#include "TimerTick.h"
/**
  * @brief  DHT11_GPIO初始化函数
  * @param  Mode：指定输入或输出模式
  * @return None
  */
uint8_t DHT_GPIO_Init(GPIOMode_TypeDef Mode)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(DHT_RCC_PORT,ENABLE);

    GPIO_SetBits(DHT_GPIO_PORT,DHT_GPIO_PIN);

    GPIO_InitStructure.GPIO_Mode = Mode;
    GPIO_InitStructure.GPIO_Pin = DHT_GPIO_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(DHT_GPIO_PORT,&GPIO_InitStructure);

    return 1;
}

/**
  * @brief  DHT11模块起始信号函数
  * @param  None
  * @return 1或0，标志起动信号成功与否
  */
uint8_t DHT_Start(void)
{
    DHT_GPIO_Init(GPIO_Mode_Out_PP);							//输出模式

    GPIO_ResetBits(DHT_GPIO_PORT,DHT_GPIO_PIN);		//输出20ms低电平后拉高
    delay_ms(20);
    GPIO_SetBits(DHT_GPIO_PORT,DHT_GPIO_PIN);

    DHT_GPIO_Init(GPIO_Mode_IN_FLOATING);					//输入模式
    delay_us(20);

    if(!GPIO_ReadInputDataBit(DHT_GPIO_PORT,DHT_GPIO_PIN))
    {
        while(!GPIO_ReadInputDataBit(DHT_GPIO_PORT,DHT_GPIO_PIN));
        while(GPIO_ReadInputDataBit(DHT_GPIO_PORT,DHT_GPIO_PIN));
        return 1;
    }
    return 0;
}

/**
  * @brief  接收DHT11发送来8位的数据
  * @param  None
  * @return 返回接收到的8位数据
  */
uint8_t DHT_Get_Byte_DHT11_Data(void)
{
    uint8_t temp;
    uint8_t t = 0;
    for(int i = 0; i < 8; i++)
    {
        temp <<= 1;
        while(!GPIO_ReadInputDataBit(DHT_GPIO_PORT,DHT_GPIO_PIN));
        delay_us(28);
        GPIO_ReadInputDataBit(DHT_GPIO_PORT,DHT_GPIO_PIN) ? (temp |= 0x01) : (temp &= ~0x01);
        while(GPIO_ReadInputDataBit(DHT_GPIO_PORT,DHT_GPIO_PIN)){
            t++;
            if(t > 200) break;
        }
    }
    return temp;
}

/**
  * @brief  获取DHT11的温度湿度数据
  * @param  buffer[]：需要传入一个存储数据的数组
  * @return 返回数据校验是否正确 1：正确 0：失败
  */
uint8_t DHT_Get_DHT11_Data(double *temp,double *humi)
{
    uint8_t buffer[5];
    if(DHT_Start())
    {
        buffer[0] = DHT_Get_Byte_DHT11_Data();
        buffer[1] = DHT_Get_Byte_DHT11_Data();
        buffer[2] = DHT_Get_Byte_DHT11_Data();
        buffer[3] = DHT_Get_Byte_DHT11_Data();
        buffer[4] = DHT_Get_Byte_DHT11_Data();
        *temp = buffer[2]+buffer[3]*0.1;
        *humi = buffer[0]+buffer[1]*0.1;
        return (buffer[0]+buffer[1]+buffer[2]+buffer[3] == buffer[4]) ? 1 : 0;
    }
    return 0;
}


